import { name } from './package.json';
import ENV_JSON from './env.json';

/**
 * @param {nodeResolve} @rollup/plugin-node-resolve
 * 解析 node_modules 中的模块；
 * 插件可以告诉 Rollup 如何查找外部模块；
 */
import { nodeResolve } from '@rollup/plugin-node-resolve';

/**
 * @param {commonjs} rollup-plugin-commonjs
 * 插件就是用来将 CommonJS 转换成 ES2015 模块的；
 * rollup-plugin-commonjs应该用在其他插件转换你的模块之前，
 * 这是为了防止其他插件的改变破坏CommonJS的检测；
 */
import commonjs from '@rollup/plugin-commonjs';

/**
 * @param {serve} rollup-plugin-serve
 * 本地服务插件
 */
import serve from 'rollup-plugin-serve';

/**
 * @param {livereload} rollup-plugin-livereload
 * 热更新插件
 */
import livereload from 'rollup-plugin-livereload';

/**
 * @param {terser} rollup-plugin-terser
 * 压缩代码
 */
import { terser } from 'rollup-plugin-terser';

/**
 * @param {json} @rollup/plugin-json
 * 一个Rollup插件，可以将.json文件转换为ES6模块。
 */
import json from '@rollup/plugin-json';

import eslint from '@rollup/plugin-eslint';
import typescript from '@rollup/plugin-typescript';

const PORT = 8080;
const HOST = '127.0.0.1'; // 设置服务器;
const CONTENT_BASE = './public/';
const WATCH_FILE = 'src/';
const ENV = process.env.ENV;
const INPUT = './src/index.ts';
const DIR = 'dist';
const FORMAT = 'umd';
const ENTRY_FILE_NAMES = '[name].umd.js';

process.env.$APP = JSON.stringify(ENV_JSON[ENV]);

function getPluginsFN() {
    const plugins = [];
    plugins.push(nodeResolve({ preferBuiltins: false }));
    plugins.push(typescript());
    plugins.push(eslint());
    plugins.push(json());

    if (ENV == 'development') {
        // 开启服务
        plugins.push(
            serve({
                port: PORT,
                host: HOST,
                contentBase: CONTENT_BASE,
            })
        );
        // 开启热更新服务
        plugins.push(
            livereload({
                watch: WATCH_FILE, // 监听文件夹;
            })
        );
    } else {
        plugins.push(terser());
    }

    plugins.push(commonjs());
    return plugins;
}

function getOutputFN() {
    let output = {
        name: name,
        format: FORMAT,
        entryFileNames: ENTRY_FILE_NAMES,
        globals: {
            // konva: 'konva',
        },
    };
    if (ENV == 'development') {
        output.file = ENV_JSON[ENV].file;
    } else {
        output.dir = DIR;
    }
    return output;
}

/**
 * cjs:
 * common.js主要用于后端，在nodejs中，node应用是由模块组成，采用的commonjs模块规范。
 * 每一个文件就是一个模块，拥有自己独立的作用域，变量，以及方法等，对其他的模块都不可见。
 * 模块可以多次加载，但是只会在第一次加载时运行一次，然后运行结果就被缓存了，以后再加载，
 * 就直接读取缓存结果。要想让模块再次运行，必须清除缓存。模块加载的顺序，按照其在代码中出现的顺序。
 */

/**
 * esm:
 * 1、按需加载（编译时加载）
 * 2、import和export命令只能在模块的顶层，不能在代码块之中（如：if语句中）,import()语句可以在代码块中实现异步动态按需动态加载
 * 环境：浏览器或服务器环境（以后可能支持）
 * 应用：ES6的最新语法支持规范
 */

/**
 * umd:
 * UMD规范只是一种通用的写法，是在amd和cjs两个流行而不统一的规范情况下，
 * 才催生出umd来统一规范的，umd前后端均可通用。
 */

/**
 * AMD说明：
 * AMD：Asynchronous Module Definition(异步模块定义)
 * 专门用于浏览器端，模块的加载是异步的
 *  基本语法：
 *    定义暴露模块：
 *    1. 没有依赖的模块：
 *      define(function(){
 *        return 模块
 *      })
 *    2. 定义有依赖的模块：
 *      define(['module1','module2'],function(m1,m2){
 *        return 模块
 *      })
 *  引入使用模块：
 *    require(['module1','module2'],function(m1,m2){
 *      使用m1/m2
 *    })
 *  实现(浏览器端)：使用库： Require.js
 */

/**
 * iife:
 * 立刻执行函数
 * $(function(){})()
 */
export default [
    {
        // external: [
        //   'fabric'
        // ],
        input: INPUT,
        output: getOutputFN(),
        plugins: getPluginsFN(),
    },
];
